package KontrolLag;
import ModelLag.*;
import java.lang.Exception.*;
import java.util.ArrayList;
import java.util.Date;

/**
 * Klasse som styrer alt hvad der har med objekter af typen Salg at goere.
 */
public class SalgCtr
{
    // instance variables - replace the example below with your own
    private SalgContainer salgContainer;
    private OrdreArkiv ordreArkiv;
    private VareCtr vareCtr;
    private PersonCtr personCtr;
    private static SalgCtr instance;
    private Person medarbejder;
    private long ordreNr;

    /**
     * Construktor til klassen SalgCtr
     */
    private SalgCtr()
    {
        salgContainer = SalgContainer.getInstance();
        ordreArkiv = OrdreArkiv.getInstance();
        vareCtr = VareCtr.getInstance();
        personCtr = PersonCtr.getInstance();
        ordreNr = 0;

    }

    /**
     * metode som finder Medarbejder og returnere denne hvis der bliver fundet noget paa et givne tlfNr
     * @param tlfNr
     * @returns Medarbejder objekt hvis det bliver fundet. ellers intet
     */
    public void setMedarbejder(String tlfNr)
    {
        medarbejder = personCtr.findPerson(tlfNr);
    }

    /**
     * get metode til Medarbejder
     */
    public Person getMedarbejder()
    {
        return medarbejder;
    }

    /**
     * Singleton
     */
    public static SalgCtr getInstance()
    {
        if(instance == null)
        {
            instance = new SalgCtr();
        }
        return instance;
    }

    /**
     * metode som finder et Salg i SalgsContaineren ud fra et givne ordreNr
     * @aaaram ordreNr som der skal soeges paa
     * @returns Ordre hvis den bliver fundet
     */
    public Salg findOrdre(long ordreNr)
    {
        return salgContainer.findOrdre(ordreNr);
    }

    /**
     * metode som finder et Salg i ordreArkivet og returnerer dette
     * @param ordreNr
     * @returns Salg hvis det bliver fundet. Hvis ikke, bliver intet returneret
     */
    public Salg findSalg(long ordreNr)
    {
        return ordreArkiv.findOrdre(ordreNr);

    }

    /**
     * 
     */
    public void fakturerOrdreKontant(long ordreNr)throws Exception
    {
        Salg s = findOrdre(ordreNr);
        if(medarbejder == null)
        {
            throw new Exception(" Der er ikke sat en medarbejder");
        }
        else
        {
            s.setMedarbejder(medarbejder);
        }
        //s.getMedarbejder().tilfoejOrdreNr(ordreNr);
        for(Vare v : s.getVareLinje().getVarer())
        {
            Vare vare = vareCtr.findVare(v.getEanNr());
            vare.setAntal(vare.getAntal() - 1);

        }
        salgContainer.sletOrdre(s);
        ordreArkiv.tilfoejOrdre(s);
        vareCtr.lagerCheck();

    }

    public void fakturerOrdreTilbud(long ordreNr, String tlfNr)throws Exception
    {
        Salg s = findOrdre(ordreNr);
        if(medarbejder == null)
        {
            throw new Exception(" Der er ikke sat en medarbejder");
        }
        else
        {
            s.setMedarbejder(medarbejder);
        }
        Person k = personCtr.findPerson(tlfNr);
        if(k == null)
        {
            throw new Exception(" Der er ikke sat en kunde");
        }
        else
        {
            s.setKunde(k);
            //k.tilfoejOrdreNr(ordreNr);
        }
        for(Vare v : s.getVareLinje().getVarer())
        {
            v.setAntal(1);
            Vare vare = vareCtr.findVare(v.getEanNr());
            vare.setAntal(vare.getAntal() - 1);

        }
        salgContainer.sletOrdre(s);
        //s.getMedarbejder().tilfoejOrdreNr(ordreNr);
        ordreArkiv.tilfoejOrdre(s);

        

    }

    /**
     * metode som opretter et Salg og tilfoejer det til SalgContaineren
     * @param salgsRabat
     * @returns Salg objekt som er blevet oprettet.
     */
    public Salg opretSalg(long salgsRabat)
    {
        ordreNr++;
        Salg s = new Salg(ordreNr, salgsRabat);
        salgContainer.tilfoejOrdre(s);
        return s;

    }

    /**
     * metode som tilfoejer et Vare objekt til et givent Salg. Desuden angives der hvor mange som skal tilfoejes
     * @param ordreNr, eanNr og antal
     */
    public void tilfoejVare(long ordreNr, String eanNr, long antal)
    {
        int index = 0;
        Salg s = findOrdre(ordreNr);
        Vare v = vareCtr.findVare(eanNr);
        while(index < antal)
        {
            Vare vare = new Vare(v.getBeskrivelse(), v.getEanNr(), v.getBestilNr(), v.getIndkoebsPris(), v.getSalgsPris(), v.getLokation(), v.getMinLager(), v.getMaxLager(), v.getAntal(), v.getLeverandoer());
            s.getVareLinje().tilfoejVare(vare);
            s.setTotal(s.getTotal() + v.getSalgsPris());
            index++;
        }
    }
    /**
     * metode som fjerner et Vare objekt fra et givent Salg. Desuden angives der hvor mange som skal fjernes
     * @param ordreNr, eanNr og antal
     */
    public void fjernVare(long ordreNr, String eanNr, long antal)
    {
        int index = 0;
        Salg s = findOrdre(ordreNr);
        Vare v = null;
        while(index < antal)
        {
            v = s.getVareLinje().findVare(eanNr);
            s.getVareLinje().fjernVare(v);
            s.setTotal(s.getTotal() - v.getSalgsPris());
            index++;
        }
    }
    
    /**
     * metode som sletter et Salg i SalgContaineren ud fra et ordreNr
     * @param ordreNr
     */
    public void sletOrdre(long ordreNr)
    {
        salgContainer.sletOrdre(findOrdre(ordreNr));
    }

    /**
     * metode som retunerer en liste med alle Salg i ordreArkiv
     * @returns ArraList med Salg 
     */
    public ArrayList<Salg> getOrdreArkiv()
    {
        return ordreArkiv.getOrdreArkiv();
    }
    
    /**
     * metode som udskriver tekst til Vare objekter som er under minimumsbeholdningen.
     */
    public void lagerCheck()throws Exception
    {
        vareCtr.lagerCheck();
    }
    
    /**
     * metode som returnerer en liste over de Salg som en Medarbejder har.
     * @param tlfNr
     * @returns ArrayList med Salg som den fundne Medarbejder har lavet.
     */
    public ArrayList<Salg> getPersonOrders(String tlfnr)
    {
        return ordreArkiv.getPersonOrders(tlfnr);
    }

}
